/**
 * 
 * @authors Your Name (you@example.org)
 * @date    2019-11-19 15:05:29
 * @version $Id$
 */

/**
 * Set构造函数，函数值是类数组，不会有重复值
 * 	Set 实例的属性和方法
		Set 结构的实例有以下属性。
	
		Array.from方法可以将 Set 结构转为数组。

		Set.prototype.constructor：构造函数，默认就是Set函数。
		Set.prototype.size：返回Set实例的成员总数。
		Set 实例的方法分为两大类：操作方法（用于操作数据）和遍历方法（用于遍历成员）。下面先介绍四个操作方法。

		Set.prototype.add(value)：添加某个值，返回 Set 结构本身。
		Set.prototype.delete(value)：删除某个值，返回一个布尔值，表示删除是否成功。
		Set.prototype.has(value)：返回一个布尔值，表示该值是否为Set的成员。
		Set.prototype.clear()：清除所有成员，没有返回值。
 */

/**
 * 遍历操作
		Set 结构的实例有四个遍历方法，可以用于遍历成员。

		Set.prototype.keys()：返回键名的遍历器
		Set.prototype.values()：返回键值的遍历器
		Set.prototype.entries()：返回键值对的遍历器
		Set.prototype.forEach()：使用回调函数遍历每个成员
 */

const items = new Set([1, 2, 3, 3, 10]);

console.log(items.size)

// 去除的重复成员
var str = [...new Set('abccdd')].join('')
console.log(str)

// 去除数组重复成员的方法。
function dedupe(array) {
  return Array.from(new Set(array));
}

dedupe([1, 1, 2, 3]) // [1, 2, 3]


var set = new Set(['red', 'green', 'blue']);

console.log(set.keys())

for (let item of set.keys()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.values()) {
  console.log(item);
}
// red
// green
// blue
var set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));

console.log(Array.from(set))


const m = new Map();

m.set('edition', 6)        // 键是字符串
m.set(262, 'standard')     // 键是数值
m.set(undefined, 'nah')    // 键是 undefined

console.log(m)


const map0 = new Map()
  .set(1, 'a')
  .set(2, 'b')
  .set(3, 'c');

const map1 = new Map(
  [...map0].filter(([k, v]) => k < 3)
);

console.log(map1)